import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
import { message } from 'antd';
import { getToken } from '../utils/auth';

/**
 * API基础URL
 */
// const BASE_URL = 'http://localhost:8080/api';
const BASE_URL = 'http://10.107.102.153:8080/api';
// const BASE_URL = 'http://172.22.1.12:8080/api';

/**
 * 创建自定义Axios实例
 */
const instance: AxiosInstance = axios.create({
  baseURL: BASE_URL,
  timeout: 1000000,
  headers: {
    'Content-Type': 'application/json',
  },
});

/**
 * 请求拦截器
 */
instance.interceptors.request.use(
  (config) => {
    // 添加认证令牌到请求头
    const token = getToken();
    if (token && config.headers) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

/**
 * 响应拦截器
 */
instance.interceptors.response.use(
  (response) => {
    // 对于blob类型的响应，直接返回原始响应
    if (response.config.responseType === 'blob') {
      return response.data;
    }
    
    // 获取响应数据
    const res = response.data;
    
    // 检查响应状态码
    if (res.code !== 200) {
      // 显示错误消息
      message.error(res.message || '请求失败');
      
      // 处理特定错误
      if (res.code === 401) {
        // 未授权，可能需要重新登录
        // 在这里可以添加重定向到登录页面等逻辑
      }
      
      return Promise.reject(new Error(res.message || '请求失败'));
    }
    
    return res;
  },
  (error) => {
    console.error('请求错误', error);
    
    // 显示错误消息
    message.error(error.response?.data?.message || '网络错误，请稍后重试');
    
    return Promise.reject(error);
  }
);

/**
 * 通用请求方法
 * @param config 请求配置
 * @returns 请求结果
 */
export const request = <T = any>(config: AxiosRequestConfig): Promise<T> => {
  return instance(config)
    .then((response: AxiosResponse) => {
      return response as unknown as T;
    })
    .catch((error) => {
      return Promise.reject(error);
    });
};

/**
 * GET请求
 * @param url 请求URL
 * @param params 请求参数
 * @returns 请求结果
 */
export const get = <T = any>(url: string, params?: any): Promise<T> => {
  return request<T>({
    method: 'get',
    url,
    params,
  });
};

/**
 * POST请求
 * @param url 请求URL
 * @param data 请求数据
 * @returns 请求结果
 */
export const post = <T = any>(url: string, data?: any): Promise<T> => {
  return request<T>({
    method: 'post',
    url,
    data,
  });
};

/**
 * PUT请求
 * @param url 请求URL
 * @param data 请求数据
 * @returns 请求结果
 */
export const put = <T = any>(url: string, data?: any): Promise<T> => {
  return request<T>({
    method: 'put',
    url,
    data,
  });
};

/**
 * DELETE请求
 * @param url 请求URL
 * @param params 请求参数
 * @returns 请求结果
 */
export const del = <T = any>(url: string, params?: any): Promise<T> => {
  return request<T>({
    method: 'delete',
    url,
    params,
  });
};

/**
 * PATCH请求
 * @param url 请求URL
 * @param data 请求数据
 * @returns 请求结果
 */
export const patch = <T = any>(url: string, data?: any): Promise<T> => {
  return request<T>({
    method: 'patch',
    url,
    data,
  });
};

/**
 * 文件上传请求
 * @param url 请求URL
 * @param formData FormData对象
 * @returns 请求结果
 */
export const upload = <T = any>(url: string, formData: FormData): Promise<T> => {
  return instance.post(url, formData, {
    headers: {
      'Content-Type': 'multipart/form-data',
    },
  }).then((response: AxiosResponse) => {
    return response.data as T;
  });
};

/**
 * 文件下载请求
 * @param url 请求URL
 * @param params 请求参数
 * @returns Blob对象
 */
export const downloadFile = <T = Blob>(url: string, params?: any): Promise<T> => {
  return axios({
    method: 'get',
    url: BASE_URL + url,
    params,
    responseType: 'blob',
    headers: {
      Authorization: `Bearer ${getToken()}`
    }
  })
  .then(response => {
    return response.data as T;
  })
  .catch(error => {
    console.error('文件下载出错:', error);
    message.error('文件下载失败');
    return Promise.reject(error);
  });
};

/**
 * 通用Excel导出功能
 * @param url 导出接口URL
 * @param params 请求参数
 * @param filename 保存的文件名，不包含扩展名，默认为"export"
 * @returns Promise，完成时表示导出成功
 */
export const exportExcel = async (url: string, params?: any, filename: string = 'export'): Promise<void> => {
  try {
    const blob = await downloadFile(url, params);
    
    // 创建下载链接
    const downloadUrl = URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = downloadUrl;
    
    // 添加时间戳到文件名
    const timestamp = new Date().toISOString().split('T')[0];
    link.download = `${filename}_${timestamp}.xlsx`;
    
    // 触发下载
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    URL.revokeObjectURL(downloadUrl);
    
    message.success('导出Excel成功');
  } catch (error) {
    console.error('导出Excel失败:', error);
    message.error('导出Excel失败');
    throw error;
  }
}; 